home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_08_06 / 8n06097a < prev    next >
Text File  |  1990-04-18  |  3KB  |  118 lines

  1. /*
  2.  *    MDBFTXT.C
  3.  *    Program:    Mini-Database
  4.  *    Written by:    Leor Zolman
  5.  *  Module:        File I/O, Text Representation Version
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include "mdb.h"
  11.  
  12. /*
  13.  * Function:        read_db
  14.  * Purpose:            Load an existing Database from disk
  15.  * Parameters:        Name of Database to load
  16.  * Return Value:    NULL on error, else # of records.
  17.  */
  18. int read_db(char *filename)
  19. {
  20.     FILE *fp;            /* File pointer            */
  21.     int rec_no = 0;        /* # of records read    */
  22.     struct record *rp;    /* Single record ptr    */
  23.     int nitems;
  24.     int active;            /* Temporary variables    */
  25.     char last[26], first[20];    /* to hold the    */
  26.     long id;            /* values of fields     */
  27.     int age;            /* during file input    */
  28.     char gender;
  29.     float salary;
  30.  
  31.     max_recs = MAX_RECS;
  32.  
  33.     if ((fp = fopen(filename, "r")) == NULL)
  34.     {
  35.         printf("Database not found.\n");
  36.         return NULL;
  37.     }
  38.     
  39.     while (1)
  40.     {            /* Read one record (one line) of data: */
  41.         nitems = fscanf(fp, "%d %s %s %ld %d %c %f\n",
  42.             &active, last, first, &id, &age,
  43.             &gender, &salary);
  44.         if (nitems == EOF)        /* stop reading on EOF    */
  45.             break;
  46.         if (nitems != 7)        /* Check for bad record    */
  47.         {
  48.             printf("Warning: Last record ignored ");
  49.             printf("(matched only %d items!)\n", nitems);
  50.             break;
  51.         }
  52.                     /* Allocate memory for one record: */
  53.         if ((rp = alloc_rec()) == NULL)
  54.         {
  55.             printf("Out of memory loading Database.\n");
  56.             return NULL;
  57.         }
  58.                     /* rp points to the memory area        */
  59.         rp->active = active;    /* assign field values:    */
  60.         strcpy(rp->last, last);
  61.         strcpy(rp->first, first);
  62.         rp->id = id;
  63.         rp->age = age;
  64.         rp->gender = gender;
  65.         rp->salary = salary;
  66.                     /* Save pointer to memory area in    */
  67.         RECS[rec_no++] = rp;    /* RECS, and bump count */
  68.     }
  69.  
  70.     fclose(fp);        /* Finished reading input file        */
  71.     return rec_no;    /* Return number of records read    */
  72. }
  73.  
  74. /*
  75.  * Function:        write_db
  76.  * Purpose:            Write current Database to disk
  77.  * Parameters:        Name of Database
  78.  * Return Value:    None
  79.  */
  80. void write_db(char *filename)
  81. {
  82.     FILE *fp;
  83.     int rec_no, result;
  84.     struct record *rp;
  85.  
  86.                     /* Write into temporary file first:    */
  87.     char *tempname = "TEMPFILE.$$$";
  88.     if ((fp = fopen(tempname, "w")) == NULL)
  89.     {
  90.         printf("Can't open temporary file %s ", tempname);
  91.         printf("for writing.\n");
  92.         return;
  93.     }
  94.     
  95.     printf("Writing Database %s To Disk...\n", filename);
  96.             /* Each loop iteration writes one record:    */
  97.     for (rec_no = 0; rec_no < n_recs; rec_no++)
  98.     {
  99.         rp = RECS[rec_no];        /* set rp to next rec    */
  100.                                 /* write rec. in ASCII    */
  101.         result = fprintf(fp, "%d %s %s %ld %d %c %f\n", 
  102.             rp->active, rp->last, rp->first, rp->id, 
  103.             rp->age, rp->gender, rp->salary);
  104.         if (result < 0)            /* Check for error        */
  105.             error("Error writing output database.\n");
  106.     }
  107.     
  108.     fclose(fp);                /* close temporary file        */
  109.     remove(filename);        /* remove old version        */
  110.     while (rename(tempname, filename) == -1)
  111.     {                        /* if renaming didn't work..*/
  112.         printf("Error renaming temp file: %s\n",
  113.                             _strerror(NULL));
  114.         printf("Please enter a new filename: ");
  115.         gets(filename);        /* try for a legal filename    */
  116.     }
  117.     printf("Database written successfully.\n");
  118. }